首页 / 技术类 / C++ / 算了,还是不 typedef 了,类型真烦

算了,还是不 typedef 了,类型真烦

2009-09-28 23:13:00

如果要 typedef,搞出来的都是些很恶心的名字,自己看了也生气,还是不搞好了,就 size_tint 玩到底吧。

把 Array 的接口又改得一塌糊涂了,重新贴一下:

  1namespace xl
  2{
  3    template <typename ValueType>
  4    class Array
  5    {
  6    public:
  7        Array(size_t nSize = 0);
  8        Array(size_t nSize, const ValueType &tValue);
  9        Array(const Array<ValueType> &that);
 10        ~Array();
 11
 12    public:
 13        class Iterator
 14        {
 15        public:
 16            Iterator();
 17            Iterator(ValueType *pValue);
 18            Iterator(ValueType *pValue, ValueType *pStart, ValueType *pEof);
 19            Iterator(const Iterator &that);
 20
 21        private:
 22            ValueType *m_pStart;
 23            ValueType *m_pEof;
 24            ValueType *m_pCurrent;
 25
 26        public:
 27            ValueType &operator * ();
 28            ValueType *operator -> ();
 29
 30        public:
 31            Iterator &operator = (const Iterator &that);
 32            bool operator == (const Iterator &that) const;
 33            bool operator != (const Iterator &that) const;
 34
 35        public:
 36            Iterator &operator ++ ();
 37            Iterator operator ++ (int);
 38            Iterator &operator -- ();
 39            Iterator operator -- (int);
 40
 41        public:
 42            Iterator operator +(int nDistance) const;
 43            Iterator operator -(int nDistance) const;
 44            Iterator &operator +=(int nDistance);
 45            Iterator &operator -=(int nDistance);
 46        };
 47
 48        class ReverseIterator : public Iterator
 49        {
 50        public:
 51            ReverseIterator &operator ++ ();
 52            ReverseIterator operator ++ (int);
 53            ReverseIterator &operator -- ();
 54            ReverseIterator operator -- (int);
 55        };
 56
 57    public:
 58        Iterator Begin() const;
 59        Iterator End() const;
 60        ReverseIterator RBegin() const;
 61        ReverseIterator REnd() const;
 62
 63
 64    public:
 65        Array<ValueType> &operator=(const Array<ValueType> &that);
 66        bool operator==(const Array<ValueType> &that) const;
 67        bool operator!=(const Array<ValueType> &that) const;
 68
 69    public:
 70        ValueType &operator[](size_t nIndex);
 71        const ValueType &operator[](size_t nIndex) const;
 72
 73    public:
 74        bool Empty();
 75        size_t Size() const;
 76        void SetSize(size_t nSize);
 77
 78    public:
 79        void Insert(const Iterator &itBeforeWhich, const ValueType &tValue);
 80        void Insert(const ReverseIterator &itBeforeWhich, const ValueType &tValue);
 81        void PushFront(const ValueType &tValue);
 82        void PushBack(const ValueType &tValue);
 83        template <typename IteratorType>
 84        void Insert(const Iterator &itBeforeWhich, const IteratorType &itFirstToInsert, const IteratorType &itAfterLastToInsert);
 85        template <typename IteratorType>
 86        void Insert(const ReverseIterator &itBeforeWhich, const IteratorType &itFirstToInsert, const IteratorType &itAfterLastToInsert);
 87        Iterator Delete(const Iterator &itWhich);
 88        ReverseIterator Delete(const ReverseIterator &itWhich);
 89        void PopFront();
 90        void PopBack();
 91        Iterator Delete(const Iterator &itFirstToInsert, const Iterator &itAfterLastToDelete);
 92        Iterator Delete(const ReverseIterator &itFirstToInsert, const ReverseIterator &itAfterLastToDelete);
 93        void Clear();
 94        void SetValue(const Iterator &itWhich, const ValueType &tValue);
 95        void SetValue(const ReverseIterator &itWhich, const ValueType &tValue);
 96        void SetValue(const Iterator &itFirstToSet, const Iterator &itAfterLastToSet, const ValueType &tValue);
 97        void SetValue(const ReverseIterator &itFirstToSet, const ReverseIterator &itAfterLastToSet, const ValueType &tValue);
 98
 99    private:
100        ValueType *m_pData;
101        size_t m_nSize;
102        size_t m_nStart;
103        size_t m_nEof;
104
105    private:
106        void Release();
107        size_t GetWellSize(size_t nSize) const;
108        void MoveData(size_t nIndex, size_t nCount, int nDistance);
109        void CopyData(size_t nIndex, size_t nCount, ValueType *pNewMem) const;
110
111    };
112}

主要的考虑,还是想实现“跨容器的 iterator”(抱歉,我还是觉得这么称呼挺符合我的预期的)。只是,在没有语言层面的 concepts 支持的情况下,如何显式地让用户知道模板参数要符合哪些条件呢?

在这里再次感谢一下 OwnWaterloo 同学,上篇评论里的东西我会继续慢慢琢磨的。^_^


首发:http://www.cppblog.com/Streamlet/archive/2009/09/28/97500.html



NoteIsSite/0.4